package org.mbcorp.sar.service.impl;

import java.util.Locale;

import org.mbcorp.sar.model.Fase;
import org.mbcorp.sar.model.ListasEmail;
import org.mbcorp.sar.model.Operador;
import org.mbcorp.sar.model.Solicitud;
import org.mbcorp.sar.service.AlertaService;
import org.mbcorp.sar.service.OperadorService;
import org.mbcorp.sar.util.mail.AMQMsgProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;

@Service("alertaService")
public class AlertaServiceImpl implements AlertaService{

	@Autowired
    private AMQMsgProducer amqMsgProducer;	

	@Autowired
    private MessageSource message;

	@Autowired
	private OperadorService operadorService;
	
	private static final Logger LOGGER = LoggerFactory
			.getLogger(SolicitudServiceImpl.class);
	
	@Override
	public void mandarAlerta(Solicitud solicitud, ListasEmail listaEmail) {
		Object[] args1 = new Object[] { solicitud.getEstado() };		
		Object[] args2 = new Object[] { solicitud.getEstado(), solicitud.getId() };
		Object[] args3 = new Object[] { solicitud.getId() };	
		String asunto = "";
		String emailDestino = "";
		String cuerpo = "";
		switch (listaEmail) {
		case VERIFICADORES:
			asunto = message.getMessage("alerta.asunto", args1, Locale.getDefault());
			cuerpo = message.getMessage("alerta.cuerpo", args2, Locale.getDefault());
			emailDestino = message.getMessage("alerta.emailVerificadores", null, Locale.getDefault());
			break;
		case COORDINADORES:
			asunto = message.getMessage("alerta.asunto", args1, Locale.getDefault());
			cuerpo = message.getMessage("alerta.cuerpo", args2, Locale.getDefault());
			emailDestino = message.getMessage("alerta.emailCoordinadores", null, Locale.getDefault());
			break;			
		case CLIENTES:
			asunto = message.getMessage("alerta.asunto", args1, Locale.getDefault());
			cuerpo = message.getMessage("alerta.cuerpo", args2, Locale.getDefault());
			emailDestino = message.getMessage("alerta.emailClientes", null, Locale.getDefault());
			break;
		case OPERADORES:
			asunto = message.getMessage("alerta.asunto", args1, Locale.getDefault());
			cuerpo = message.getMessage("alerta.cuerpo", args2, Locale.getDefault());
			emailDestino = message.getMessage("alerta.emailOperadores", null, Locale.getDefault());
			break;
		case CLIENTE:
			asunto = message.getMessage("alertaCliente.asunto", args3, Locale.getDefault());
			cuerpo = message.getMessage("alertaCliente.cuerpo", args3, Locale.getDefault());
			emailDestino = solicitud.getSolicitante().getEmailPrincipal().getDireccionCorreo();
			break;
		case COORDINADOR:
			//TODO
			break;
		case VERIFICADOR:
			//TODO
			break;
		}		
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
		
	}
	
	@Override
	public void mandarAlertaOperadores(Solicitud solicitud) {
		Object[] args1 = new Object[] { solicitud.getEstado() };
		Object[] args2 = new Object[] { solicitud.getEstado(), solicitud.getId() };
		for(Operador o : operadorService.filtrarOperadores(solicitud)){
			String asunto = message.getMessage("alertaOperadores.asunto", args1, Locale.getDefault());		
			String cuerpo = message.getMessage("alertaOperadores.cuerpo", args2, Locale.getDefault());
			String emailDestino = 	o.getEmail();
			amqMsgProducer.produce(asunto, cuerpo, emailDestino);
		}		
	}
	
	@Override
	public void mandarAlertaOperadores(Fase fase) {
		Object[] args = new Object[] { fase.getNombre(), fase.getSolicitud().getId() };
		for(Operador o : operadorService.filtrarOperadores(fase)){
			String asunto = message.getMessage("alertaInicioOperadores.asunto", args, Locale.getDefault());		
			String cuerpo = message.getMessage("alertaInicioOperadores.cuerpo", args, Locale.getDefault());
			String emailDestino = 	o.getEmail();
			amqMsgProducer.produce(asunto, cuerpo, emailDestino);
		}		
	}
	
	@Override
	public void mandarAlertaAprobacionProgramacion(Solicitud solicitud, boolean fueraPlazo) {
		Object[] args = new Object[] { solicitud.getId() };
		String emailDestino = message.getMessage("alerta.emailCoordinadores", null, Locale.getDefault());
		String asunto ="";
		String cuerpo ="";
		if(fueraPlazo){
			asunto = message.getMessage("alertaAprobacionFP.asunto", args, Locale.getDefault());		
			cuerpo = message.getMessage("alertaAprobacionFP.cuerpo", args, Locale.getDefault());
		} else {
			asunto = message.getMessage("alertaAprobacion.asunto", args, Locale.getDefault());		
			cuerpo = message.getMessage("alertaAprobacion.cuerpo", args, Locale.getDefault());
		}		
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
	}
	
	@Override
	public void mandarAlertaRechazoProgramacion(Solicitud solicitud) {
		Object[] args = new Object[] { solicitud.getId() };
		String asunto = message.getMessage("alertaRechazo.asunto", args, Locale.getDefault());		
		String cuerpo = message.getMessage("alertaRechazo.cuerpo", args, Locale.getDefault());
		String emailDestino = message.getMessage("alerta.emailCoordinadores", null, Locale.getDefault());
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
	}
	
	public void mandarAlertaReprogramar(Solicitud solicitud, ListasEmail listaEmail) {
		Object[] args1 = new Object[] { solicitud.getEstado() };		
		Object[] args2 = new Object[] { solicitud.getEstado(), solicitud.getId() };	
		Object[] args3 = new Object[] { solicitud.getId() };	
		String asunto = "";
		String emailDestino = "";
		String cuerpo = "";
		switch (listaEmail) {		
		case CLIENTES:
			asunto = message.getMessage("alerta.asunto", args1, Locale.getDefault());
			cuerpo = message.getMessage("alerta.cuerpo", args2, Locale.getDefault());
			emailDestino = message.getMessage("alerta.emailClientes", null, Locale.getDefault());
			break;
		case OPERADORES:
			asunto = message.getMessage("alerta.asunto", args1, Locale.getDefault());
			cuerpo = message.getMessage("alerta.cuerpo", args2, Locale.getDefault());
			emailDestino = message.getMessage("alerta.emailOperadores", null, Locale.getDefault());
			break;
		case CLIENTE:
			asunto = message.getMessage("alertaCliente.asunto", args3, Locale.getDefault());
			cuerpo = message.getMessage("alertaCliente.cuerpo", args3, Locale.getDefault());
			emailDestino = solicitud.getSolicitante().getEmailPrincipal().getDireccionCorreo();
			break;
		case COORDINADOR:
			//TODO
			break;
		case VERIFICADOR:
			//TODO
			break;
		}		
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
		
	}	

	public void mandarAlertaObservacionProgramacion(Solicitud solicitud) {
		Object[] args = new Object[] { solicitud.getId() };
		String asunto = message.getMessage("alertaObservacion.asunto", args, Locale.getDefault());		
		String cuerpo = message.getMessage("alertaObservacion.cuerpo", args, Locale.getDefault());
		String emailDestino = message.getMessage("alerta.emailCoordinadores", null, Locale.getDefault());
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
	}
	
	public void alertaFinFase(Fase fase){
		Object[] args = new Object[] { fase.getNombre(), fase.getSolicitud().getId() };
		String asunto = message.getMessage("alertaFinFase.asunto", args, Locale.getDefault());		
		String cuerpo = message.getMessage("alertaFinFase.cuerpo", args, Locale.getDefault());
		String emailDestino = message.getMessage("alerta.emailCoordinadores", null, Locale.getDefault());
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
	}
	
	public void alertaFinSolicitud(Solicitud solicitud){
		Object[] args = new Object[] { solicitud.getId() };
		String asunto = message.getMessage("alertaFinSolicitud.asunto", args, Locale.getDefault());		
		String cuerpo = message.getMessage("alertaFinSolicitud.cuerpo", args, Locale.getDefault());
		String emailDestino = message.getMessage("alerta.emailCoordinadores", null, Locale.getDefault());
		amqMsgProducer.produce(asunto, cuerpo, emailDestino);
	}
}
